package com.zp.self.module.level_4_算法练习.数据结构.数组;


/**
 * @author By ZengPeng
 */
public class 力扣_628_三个数的最大乘积 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_628_三个数的最大乘积().maximumProduct(new int[]{7,1,5,3,6,4}));
    }

    /**
    题目：给你一个整型数组 nums ，在数组中找出由三个数组成的最大乘积，并输出这个乘积。

     示例 1：
     输入：nums = [1,2,3]
     输出：6

     示例 2：
     输入：nums = [1,2,3,4]
     输出：24

     示例 3：
     输入：nums = [-1,-2,-3]
     输出：-6

    分析：【P 💖💝】
       1.排序+分析: 分类判断全正，全负数，有正负
            --执行用时：13 ms, 在所有 Java 提交中击败了12.54%的用户
       2.硬找3个最大值，两个最小值
            --执行用时：2 ms, 在所有 Java 提交中击败了99.59%的用户
    边界值 & 注意点：
       1.
     **/
    public int maximumProduct(int[] nums) {
        // 最小的和第二小的
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        // 最大的、第二大的和第三大的
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
        for (int x : nums) {
            if(x<min1){
                min2 = min1;
                min1=x;
            }else if(x<min2){
                min2 = x;
            }

            if(x>max1){
                max3 = max2;
                max2 = max1;
                max1=x;
            }else if(x>max2){
                max3 = max2;
                max2 = x;
            }else if(x>max3){
                max3 = x;
            }
        }
        return Math.max(min1 * min2 * max1, max1 * max2 * max3);

        //1.排序+分析: 分类判断全正，全负数，有正负
   /*     Arrays.sort(nums);
        int length = nums.length;
        return Math.max(nums[length-3]*nums[length-2]*nums[length-1],
                nums[0]*nums[1]*nums[length-1]);*/
    }
}
